{"componentChunkName":"component---src-templates-blog-post-js","path":"/Design-Pattern/[디자인-패턴]-facade-pattern/","result":{"data":{"site":{"siteMetadata":{"title":"Hun's Footsteps 🥷","author":"전여훈","siteUrl":"https://jeonyeohun.netlify.app","comment":{"disqusShortName":"","utterances":"jeonyeohun/jeonyeohun.github.io"},"sponsor":{"buyMeACoffeeId":"jeonyeohun"}}},"markdownRemark":{"id":"aa123953-57e8-5fb8-8077-6b44cf89018a","excerpt":"Facade Pattern  Facade 패턴은 하나의 인터페이스를 통해 여러 서브시스템의 기능을 통합해서 사용할 수 있도록 하는 디자인 패턴이다. 만약 사용자가 호출해야하는 클래스의 메서드가 여러개가 있다면, Facade 역할을 하는 인터페이스를 하나 만들고 사용자에게는 하나의 함수만 호출하게 한 뒤, 자신이 다른 서브 클래스들의 함수를 호출하여 로직을 수행한다. Why Facade Pattern? Facade…","html":"<h2 id=\"facade-pattern\" style=\"position:relative;\"><a href=\"#facade-pattern\" aria-label=\"facade pattern permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Facade Pattern</h2>\n<p><img src=\"https://upload.wikimedia.org/wikipedia/en/5/57/Example_of_Facade_design_pattern_in_UML.png\"></p>\n<p>Facade 패턴은 하나의 인터페이스를 통해 여러 서브시스템의 기능을 통합해서 사용할 수 있도록 하는 디자인 패턴이다.</p>\n<p>만약 사용자가 호출해야하는 클래스의 메서드가 여러개가 있다면, Facade 역할을 하는 인터페이스를 하나 만들고 사용자에게는 하나의 함수만 호출하게 한 뒤, 자신이 다른 서브 클래스들의 함수를 호출하여 로직을 수행한다.</p>\n<h2 id=\"why-facade-pattern\" style=\"position:relative;\"><a href=\"#why-facade-pattern\" aria-label=\"why facade pattern permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why Facade Pattern?</h2>\n<p>Facade 패턴을 사용하면 두 가지 이점을 얻을 수 있다.</p>\n<ol>\n<li>클라이언트는 복잡한 기능을 간단하게 호출하여 수행할 수 있다.</li>\n<li>인터페이스 하나로 서브 클래스들을 사용하기 때문에 각 서브 클래스들 간의 의존성이 낮아진다.</li>\n</ol>\n<h2 id=\"example\" style=\"position:relative;\"><a href=\"#example\" aria-label=\"example permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Example</h2>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">struct</span> <span class=\"token class-name\">CPU</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">Freeze</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">Jump</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span> position<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">struct</span> <span class=\"token class-name\">HardDrive</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">char</span><span class=\"token operator\">*</span> <span class=\"token function\">Read</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span> lba<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">struct</span> <span class=\"token class-name\">Memory</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">Load</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span> position<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span><span class=\"token operator\">*</span> data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ComputerFacade</span> <span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">public</span><span class=\"token operator\">:</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">Start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    cpu_<span class=\"token punctuation\">.</span><span class=\"token function\">Freeze</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    memory_<span class=\"token punctuation\">.</span><span class=\"token function\">Load</span><span class=\"token punctuation\">(</span>kBootAddress<span class=\"token punctuation\">,</span> hard_drive_<span class=\"token punctuation\">.</span><span class=\"token function\">Read</span><span class=\"token punctuation\">(</span>kBootSector<span class=\"token punctuation\">,</span> kSectorSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    cpu_<span class=\"token punctuation\">.</span><span class=\"token function\">Jump</span><span class=\"token punctuation\">(</span>kBootAddress<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    cpu_<span class=\"token punctuation\">.</span><span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n <span class=\"token keyword\">private</span><span class=\"token operator\">:</span>\n  CPU cpu_<span class=\"token punctuation\">;</span>\n  Memory memory_<span class=\"token punctuation\">;</span>\n  HardDrive hard_drive_<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ComputerFacade computer<span class=\"token punctuation\">;</span>\n  computer<span class=\"token punctuation\">.</span><span class=\"token function\">Start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<blockquote>\n<p><a href=\"https://en.wikipedia.org/wiki/Facade_pattern\">https://en.wikipedia.org/wiki/Facade_pattern</a></p>\n</blockquote>\n<p>위 예시에서는 cpu 를 멈추고, 메모리에 접근한 뒤에, cpu의 주소를 jump 시키고 다시 cpu를 시작하는 작업을 수행해야한다. 글로 보아도 헷갈린다.</p>\n<p>그래서 이 모든 작업을 Facade 클래스인 Computer Facade에 만들어두고, 사용자는 Wrapper 함수인 <code class=\"language-text\">Start()</code> 만 호출하면 된다.</p>\n<p>이를 통해 사용자에게는 높은 사용성을 제공하고, 시스템이 복잡해지지 않게도는 효과를 얻을 수 있다.</p>","frontmatter":{"title":"[디자인 패턴] Facade Pattern","date":"May 25, 2021"}}},"pageContext":{"slug":"/Design-Pattern/[디자인-패턴]-facade-pattern/","previous":{"fields":{"slug":"/Design-Pattern/[디자인-패턴]-memento-pattern/"},"frontmatter":{"title":"[디자인 패턴] Memento Pattern","category":"Design-Pattern","draft":false}},"next":{"fields":{"slug":"/Problem-Solving/[프로그래머스]-짝지어-제거하기/"},"frontmatter":{"title":"[프로그래머스] 짝지어 제거하기","category":"Problem-Solving","draft":false}}}},"staticQueryHashes":["2486386679","3128451518"]}